package com.nfit.shopweb.service.impl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.nfit.shopmodel.dto.product.ProductDto;
import com.nfit.shopmodel.entity.product.Product;
import com.nfit.shopmodel.entity.product.ProductDetails;
import com.nfit.shopmodel.entity.product.ProductSku;
import com.nfit.shopweb.mapper.ProductDetailsMapper;
import com.nfit.shopweb.mapper.ProductMapper;
import com.nfit.shopweb.mapper.ProductSkuMapper;
import com.nfit.shopweb.service.ProductService;

import io.swagger.v3.oas.annotations.media.Schema;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;


/**
 * ClassName:ProductServiceImpl
 * Package:com.nfit.shopweb.service.impl
 * Description
 *
 * @Author L
 * @Create 2024/12/17 10:57
 */
@Schema(description = "商品业务处理")
@Service
public class ProductServiceImpl implements ProductService {

    @Autowired
    private ProductMapper productMapper;

    @Autowired
    private ProductSkuMapper productSkuMapper;

    @Autowired
    private ProductDetailsMapper productDetailsMapper;


    @Override
    public PageInfo<Product> page(Integer pageNum, Integer pageSize, ProductDto productDto) {
        PageHelper.startPage(pageNum,pageSize);
        List<Product> list = productMapper.page(productDto);
        return new PageInfo<>(list);
    }


    /**
     * 修改
     * @param product
     */
    @Transactional
    @Override
    public void update(Product product) {
        //修改商品基本信息
        productMapper.update(product);
        //修改商品sku信息
        product.getProductSkuList().stream().forEach(productSku -> {
            productSkuMapper.update(productSku);
        });
        //修改商品详情信息
        String detailsImageUrls = product.getDetailsImageUrls(); //获取前端传来的商品详情图片地址
        ProductDetails productDetails = productDetailsMapper.findByProductId(product.getId()); //根据商品id查询商品详情对象
        productDetails.setImageUrls(detailsImageUrls); //封装商品详情图片url
        productDetailsMapper.update(productDetails); //修改商品详情信息
    }

    /**
     * 商品添加
     */
    @Transactional
    @Override
    public void save(Product product) {
        //因为添加设置初始值
        product.setAuditStatus(0);
        product.setStatus(0);
        productMapper.save(product);
        int i = 0;
        //获取sku集合，值前端传递
        List<ProductSku> productSkuList = product.getProductSkuList();

        //遍历,封装sku数据
        productSkuList.stream().forEach(psku -> {
            psku.setSkuCode(product.getId()+"_" + Integer.valueOf(i+1)); //skuCode
            psku.setProductId(product.getId());  //商品id
            psku.setSkuName(product.getName() + psku.getSkuSpec()); //sku名称
            psku.setSaleNum(0); //销量
            psku.setStatus(0); //状态
            productSkuMapper.save(psku);
        });

        //封装数据.保存商品详情信息,就是商品详情信息图片
        ProductDetails productDetails = new ProductDetails();
        productDetails.setProductId(product.getId()); //商品id
        productDetails.setImageUrls(product.getDetailsImageUrls()); //商品详情信息图片
        productDetailsMapper.save(productDetails);
    }

    /**
     * 根据商品id查询商品信息
     * @param id 商品id
     */
    @Override
    public Product findById(Long id) {
        //根据商品id获取商品信息
        Product product = productMapper.findById(id);
        //根据商品id查询商品sku
        List<ProductSku> productSkuList = productSkuMapper.findByProductId(product.getId());
        product.setProductSkuList(productSkuList); //封装数据

        //根据商品id查询商品详情信息(商品的详情图片)
        ProductDetails productDetails = productDetailsMapper.findByProductId(product.getId());
        product.setDetailsImageUrls(productDetails.getImageUrls()); //封装数据
        return product;
    }

    /**
     * 根据商品id删除
     * @param id 商品id
     */
    @Transactional
    @Override
    public void delete(Long id) {
        productMapper.delete(id);
        productSkuMapper.delete(id);
        productDetailsMapper.delete(id);
    }

    /**
     * 审批商品
     * @param productId 商品id
     * @param auditStatus 审批状态，前端传 1 表示通过 -1 表示驳回
     */
    @Override
    public void updateAuditStatus(Long productId, Integer auditStatus) {
        Product product = new Product();
        product.setId(productId);
        //判断auditStatus 有两种情况，一种通过，另一种不通过,分别封装不同的数据
        if(auditStatus == 1){
            product.setAuditStatus(1);
            product.setAuditMessage("审核通过");
        }else {
            product.setAuditStatus(-1);
            product.setAuditMessage("审核不通过");
        }
        productMapper.update(product);
    }

    /**
     * 上下架商品
     * @param productId 商品id
     * @param status 上下架状态： 前端传 1 表示上架 -1 表示下架
     */
    @Override
    public void updateStatus(Long productId, Integer status) {
        Product product = new Product();
        product.setId(productId);
        //判断
        if(status == 1 ){
            product.setStatus(1);
        }else {
            product.setStatus(-1);
        }
        productMapper.update(product);
    }
}
